package com.librelato.tela;

import java.io.File;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.primefaces.context.RequestContext;

import com.librelato.bean.PedidoBean;
import com.librelato.bean.ProdutoBean;
import com.librelato.bean.SolicitacaoBean;
import com.librelato.bean.UsuarioBean;
import com.librelato.negocio.PedidoServico;
import com.librelato.negocio.ProdutoServico;
import com.librelato.negocio.SolicitacaoServico;
import com.librelato.negocio.interfaces.IServicoGenerico;
import com.librelato.util.Ferramentas;
import com.librelato.webservices.DadosPedido;
import com.librelato.webservices.ListaPedido;
import com.librelato.webservices.WsSoapStubPedido;

@ManagedBean
@ViewScoped
public class ConsultaPedidoTela extends TelaAbstrata {

	private UsuarioBean usuario;

	private SolicitacaoBean solicitacao;

	private SolicitacaoServico<SolicitacaoBean> solicitacaoServico;

	private PedidoServico<PedidoBean> pedidoServico;

	private ProdutoServico<ProdutoBean> produtoServico;

	private String filialFiltro;

	private String numSolicitacaoFiltro;

	private String numPedidoFiltro;

	private String dataDeFiltro;

	private String dataAteFiltro;

	private String codProdFiltro;

	private String descProdFiltro;

	private String statusFiltro;

	private String numOPFiltro;

	private String codForneceFiltro;

	private String nomeForneceFiltro;

	private List<SolicitacaoBean> listaSolicitacoes;

	private List<ProdutoBean> listaProdutosEditar;

	private SolicitacaoBean solicitacaoPedidoEditarSel;

	private List<ProdutoBean> itensSolicitacao;

	private String historicoTexto;

	private String numPedido;

	public ConsultaPedidoTela() {
		usuario = usuario == null ? (UsuarioBean) ((HttpSession) FacesContext
				.getCurrentInstance().getExternalContext().getSession(false))
				.getAttribute("usuario") : usuario;
		solicitacaoServico = new SolicitacaoServico<SolicitacaoBean>();

		dataAteFiltro = Ferramentas.formataData(new Date().getTime(),
				"dd/MM/yy");
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(new Date());
		calendar.add(Calendar.DATE, -30);
		dataDeFiltro = Ferramentas.formataData(calendar.getTime().getTime(),
				"dd/MM/yy");
		pedidoServico = new PedidoServico<PedidoBean>();
	}

	public void filtraSolicitacoes() {
		Map<String, String> param = new HashMap<String, String>();
		if (dataDeFiltro != null && !"".equals(dataDeFiltro)) {
			param.put("DATADE", dataDeFiltro);
		}
		if (dataAteFiltro != null && !"".equals(dataAteFiltro)) {
			param.put("DATAATE", dataAteFiltro);
		}
		if (codProdFiltro != null && !"".equals(codProdFiltro)) {
			param.put("PRODUTO", codProdFiltro);
		}
		if (numSolicitacaoFiltro != null && !"".equals(numSolicitacaoFiltro)) {
			param.put("NUMSOL", numSolicitacaoFiltro);
		}
		if (numPedidoFiltro != null && !"".equals(numPedidoFiltro)) {
			param.put("NUMPEDIDO", numPedidoFiltro);
		}
		if (filialFiltro != null && !"".equals(filialFiltro)
				&& !"Todos".equals(filialFiltro)) {
			param.put("FILIAL", filialFiltro);
		}
		if (statusFiltro != null && !"".equals(statusFiltro.trim())
				&& !"Todos".equals(statusFiltro.trim())) {
			param.put("STATUS", statusFiltro);
		}
		if (numOPFiltro != null && !"".equals(numOPFiltro.trim())) {
			param.put("NUMOP", numOPFiltro);
		}
		if (codForneceFiltro != null && !"".equals(codForneceFiltro.trim())) {
			param.put("CODFORNE", codForneceFiltro);
		}
		if (nomeForneceFiltro != null && !"".equals(nomeForneceFiltro.trim())) {
			param.put("NOMEFORNE", nomeForneceFiltro);
		}
		if (descProdFiltro != null && !"".equals(descProdFiltro.trim())) {
			param.put("DESCPROD", descProdFiltro);
		}
		try {
			listaSolicitacoes = solicitacaoServico
					.buscaSolicitacoesCompradorConsulta(param, usuario);
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	public void excluiPedido() {
		try {
			WsSoapStubPedido stubPedido = new WsSoapStubPedido();
			DadosPedido dadosPedido;
			List<DadosPedido> listaDadosPedido = new ArrayList<DadosPedido>();
			// pedidoServico.buscaPedidos("", "", solici, "", filial, "", "");
			for (ProdutoBean produto : solicitacao.getItensSolicitacao()) {
				dadosPedido = new DadosPedido();
				dadosPedido
						.setNumPed(solicitacao.getPedido().getNumeroPedido());
				dadosPedido.setFornece(solicitacao.getPedido().getFornecedor()
						.getCodigo());
				dadosPedido.setLoja(solicitacao.getPedido().getFornecedor()
						.getLoja());
				// dadosPedido.setCond(solicitacao.getPedido().getCondPag().getCodigo());
				// dadosPedido.setTpFrete(solicitacao.getPedido().getTipoFrete());
				// dadosPedido.setTransp(solicitacao.getPedido().getTransportadora().getCodigo());
				dadosPedido.setContato(solicitacao.getPedido().getFornecedor()
						.getContato());
				dadosPedido.setItemPed(produto.getItemPosicao());
				dadosPedido.setProd(produto.getCodigo());
				dadosPedido.setProDesc(produto.getDescricao());
				// dadosPedido.setArma(produto.getLocal());
				dadosPedido.setNumSc(solicitacao.getNumSolicitacao());
				dadosPedido.setItemSc(solicitacao.getItem());
				dadosPedido.setFilial(solicitacao.getFilial());
				// dadosPedido.setCc(produto.getCentroCusto().getCodigo());
				// dadosPedido.setQuant(produto.getQuantidade());
				// dadosPedido.setPreco(produto.getPreco());
				// dadosPedido.setDtNece(produto.getNecessidade());
				// dadosPedido.setValIpi(produto.getIpi());
				// dadosPedido.setpIcm(produto.getIcms());
				// dadosPedido.setObs(produto.getObservacao());
				listaDadosPedido.add(dadosPedido);
			}
			DadosPedido[] vetorPedido = listaDadosPedido
					.toArray(new DadosPedido[listaDadosPedido.size()]);
			ListaPedido listaPedido = new ListaPedido(vetorPedido);
			numPedido = stubPedido.excluiPed(listaPedido);

			if (numPedido.trim().length() <= 6) {
				FacesMessage message = new FacesMessage(
						FacesMessage.SEVERITY_INFO, this.getServico().getValor(
								"msg_header_sucesso"), this.getServico()
								.getValor("msg_exlusao_pedido")
								+ "("
								+ numPedido + ")");
				FacesContext.getCurrentInstance().addMessage(null, message);
				filtraSolicitacoes();
			} else {
				RequestContext.getCurrentInstance().execute(
						"dlgErroPedido2.show()");
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void enviaEmailFornecedor() {
		try {
			List<PedidoBean> listaPedidos = this.pedidoServico.buscaPedidos("",
					"", solicitacao.getPedido().getNumeroPedido(), "",
					solicitacao.getFilial(), solicitacao.getPedido()
							.getFornecedor().getCodigo(), true);
			PedidoBean pedido = listaPedidos.get(0);
			this.pedidoServico.imprime(pedido, usuario.getCodigo());
			File arquivo = new File(Ferramentas.getDiretorioReal("/rel/")
					+ "\\pedido" + usuario.getCodigo() + ".pdf");
			StringBuilder corpoEmail = new StringBuilder();
			corpoEmail.append("<html>");
			corpoEmail.append("<head>");
			corpoEmail.append("<title>.:: Web ::.</title>");
			corpoEmail
					.append("<meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'>");
			corpoEmail.append("</head>");
			corpoEmail.append("<body bgcolor='#FFFFFF' text='#000000'>");
			corpoEmail
					.append("<table width='100%' border='0' align='center' cellpadding='0' cellspacing='0' height='114' >");
			corpoEmail.append("<tr bgcolor='#FFFFFF'>");
			corpoEmail.append("<td width='86%' valign='bottom' height='48'> ");
			corpoEmail.append("<hr noshade color='#000000'>");
			corpoEmail.append("<table border='0' width='100%'>");
			corpoEmail.append("<tr>");
			corpoEmail.append("<td width='100%'>");
			corpoEmail
					.append("<p align='center'><b>PORTAL DE COMPRAS LIBRELATO - ");
			corpoEmail.append(Ferramentas.formataData(new Date().getTime(),
					"dd/MM/yy"));
			corpoEmail.append("</b></p>");
			corpoEmail.append("</td>");
			corpoEmail.append("</tr>");
			corpoEmail.append("</table>");
			corpoEmail.append("<hr noshade color='#000000'>");
			corpoEmail.append("</td>");
			corpoEmail.append("</table>");
			corpoEmail.append("Prezado fornecedor <b>");
			corpoEmail.append(pedido.getFornecedor().getNome().trim());
			corpoEmail.append("</b>,");
			corpoEmail.append(" segue em anexo o Pedido de Compra  Nº");
			corpoEmail.append(pedido.getNumeroPedido());
			corpoEmail
					.append(". Caso tenha dificuldades para visualizar, acesse o <a href=http://sol.librelato.com.br:8090/SOL/>");
			corpoEmail.append("Portal do Fornecedor</a>");
			corpoEmail.append(".");
			corpoEmail.append("<br>");
			corpoEmail
					.append("Caso você não possua seu código e senha de acesso, favor entrar em contato com o departamento de compras.");
			corpoEmail.append("<hr noshade color='#000000'>");
			corpoEmail.append("</body>");
			corpoEmail.append("</html>");
			Ferramentas.enviaEmailPDF(corpoEmail.toString(),
					"Pedido de Compra", pedido.getFornecedor().getEmail(),
					"COMPRAS", arquivo);
			FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO,
					this.getServico().getValor("msg_header_sucesso"), this
							.getServico().getValor("msg_email_enviado"));
			FacesContext.getCurrentInstance().addMessage(null, message);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public String pintaLinhaBusca(String produto) {
		String corLinha = "";
		if (codProdFiltro != null && !"".equals(codProdFiltro.trim())
				&& codProdFiltro.trim().equals(produto.trim())) {
			corLinha = "LinhaBusca";
		}
		return corLinha;
	}

	public String pintaLinha(SolicitacaoBean solicitacao) {
		String classe = "";
		if (this.statusFiltro == null || "".equals(this.statusFiltro)
				|| "Todos".equals(this.statusFiltro)) {
			Collections.sort(solicitacao.getItensSolicitacao());
			for (ProdutoBean produto : solicitacao.getItensSolicitacao()) {
				if (produto.getStatusProduto().trim().equals("Aprovado")) {
					classe = "LinhaApro";
					break;
				} else if (produto.getStatusProduto().trim()
						.equals("Bloqueado")) {
					classe = "LinhaBloq";
					break;
				} else if (produto.getStatusProduto().trim().equals("Comprado")) {
					classe = "LinhaComp";
					break;
				} else if (produto.getStatusProduto().trim().equals("Negado")) {
					classe = "LinhaNega";
					break;
				} else if (produto.getStatusProduto().trim().equals("Recebido")) {
					classe = "LinhaRece";
					break;
				}

			}
		}
		return classe;
	}

	public String pintaLinhaProduto(ProdutoBean produto) {
		String classe = "";
		if (codProdFiltro != null && !"".equals(codProdFiltro.trim())
				&& codProdFiltro.trim().equals(produto.getCodigo().trim())) {
			classe = "LinhaBusca";
		} else {

			if (produto.getStatusProduto().trim().equals("Bloqueado")) {
				classe = "LinhaBloq";
			} else if (produto.getStatusProduto().trim().equals("Aprovado")) {
				classe = "LinhaApro";
			} else if (produto.getStatusProduto().trim().equals("Negado")) {
				classe = "LinhaNega";
			} else if (produto.getStatusProduto().trim().equals("Comprado")) {
				classe = "LinhaComp";
			} else if (produto.getStatusProduto().trim().equals("Recebido")) {
				classe = "LinhaRece";
			}
		}
		return classe;
	}

	public void preencheHistorico(ProdutoBean produto) {
		this.historicoTexto = "";
		try {
			SolicitacaoBean sol = new SolicitacaoBean();
			sol.setFilial(solicitacao.getFilial());
			sol.setItem(produto.getItemPosicao());
			sol.setNumSolicitacao(solicitacao.getNumSolicitacao());
			sol.setHistoricos(this.solicitacaoServico.buscaHistoricos(sol));
			for (int i = 0; i < sol.getHistoricos().size(); i++) {
				historicoTexto += Ferramentas
						.formataData(sol.getHistoricos().get(i)
								.getDataEmissao().getTime(),
								"dd/MM/yy HH:mm:ss")
						+ " - "
						+ sol.getHistoricos().get(i).getDescricao().trim()
						+ " ("
						+ sol.getHistoricos().get(i).getObservacao().trim()
						+ ")<br/>";
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	public void atualizaGradePedido(SolicitacaoBean solicitacaoTela) {
		try {
			if (solicitacaoTela != null
					&& solicitacaoTela.getStatus() != null
					&& ("Comprado".equals(solicitacaoTela.getStatus()) || "Recebido"
							.equals(solicitacaoTela.getStatus()))) {
				solicitacao = this.solicitacaoServico
						.buscaDadosPedido(solicitacaoTela);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void imprime() {
		try {
			List<PedidoBean> listaPedidos = this.pedidoServico.buscaPedidos("",
					"", solicitacao.getPedido().getNumeroPedido(), "",
					solicitacao.getFilial(), solicitacao.getPedido()
							.getFornecedor().getCodigo(), true);
			PedidoBean pedido = listaPedidos.get(0);
			byte[] b = this.pedidoServico.imprime(pedido, usuario.getCodigo());
			FacesContext facesContext = FacesContext.getCurrentInstance();
			ExternalContext externalContext = facesContext.getExternalContext();
			HttpServletResponse response = (HttpServletResponse) externalContext
					.getResponse();
			response.reset();
			response.setContentType("application/pdf");
			response.setHeader("Content-disposition",
					"attachment; filename=\"Pedido\"");
			OutputStream output = response.getOutputStream();
			output.write(b);
			output.close();
			facesContext.responseComplete();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void preparaEdicaoPedido() {
		try {
			Map<String, String> param = new HashMap<String, String>();
			param.put("FILIAL", solicitacaoPedidoEditarSel.getFilial());
			param.put("NUMPED", solicitacaoPedidoEditarSel.getPedido()
					.getNumeroPedido());
			param.put("FORNE", solicitacaoPedidoEditarSel.getPedido()
					.getFornecedor().getCodigo());
			param.put("LOJAFOR", solicitacaoPedidoEditarSel.getPedido()
					.getFornecedor().getLoja());
			produtoServico = new ProdutoServico<ProdutoBean>();
			listaProdutosEditar = produtoServico.buscaProdutosPedido(param);
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	public void alteraPedido() {
		try {
			WsSoapStubPedido stubPedido = new WsSoapStubPedido();
			DadosPedido dadosPedido;
			List<DadosPedido> listaDadosPedido = new ArrayList<DadosPedido>();
			for (ProdutoBean produto : listaProdutosEditar) {
				dadosPedido = new DadosPedido();
				
				dadosPedido.setNumPed(solicitacaoPedidoEditarSel.getPedido()
						.getNumeroPedido());
				dadosPedido.setFornece(solicitacaoPedidoEditarSel.getPedido()
						.getFornecedor().getCodigo());
				dadosPedido.setLoja(solicitacaoPedidoEditarSel.getPedido()
						.getFornecedor().getLoja());
				dadosPedido.setCond(solicitacaoPedidoEditarSel.getPedido()
						.getCondPag().getCodigo());
				dadosPedido.setTpFrete(solicitacaoPedidoEditarSel.getPedido()
						.getTipoFrete());
				dadosPedido.setTransp(solicitacaoPedidoEditarSel.getPedido()
						.getTransportadora().getCodigo());
				dadosPedido.setContato(solicitacaoPedidoEditarSel.getPedido()
						.getFornecedor().getContato());
				dadosPedido.setItemPed(produto.getItemPosicao());
				dadosPedido.setProd(produto.getCodigo());
				dadosPedido.setProDesc(produto.getDescricao());
				dadosPedido.setArma(produto.getLocal());
				dadosPedido.setNumSc(solicitacaoPedidoEditarSel
						.getNumSolicitacao());
				dadosPedido.setItemSc(solicitacaoPedidoEditarSel.getItem());
				dadosPedido.setCc(produto.getCentroCusto().getCodigo());
				dadosPedido.setQuant(produto.getQuantidade());
				dadosPedido.setPreco(produto.getPreco());
				dadosPedido.setDtNece(produto.getNecessidade());
				dadosPedido.setValIpi(produto.getIpi());
				dadosPedido.setpIcm(produto.getIcms());
				dadosPedido.setObs(produto.getObservacao());
				dadosPedido.setFilial(solicitacaoPedidoEditarSel.getFilial());
				listaDadosPedido.add(dadosPedido);
			}
			DadosPedido[] vetorPedido = listaDadosPedido
					.toArray(new DadosPedido[listaDadosPedido.size()]);
			ListaPedido listaPedido = new ListaPedido(vetorPedido);
			numPedido = stubPedido.alteraPed(listaPedido);

			if (numPedido.trim().length() <= 6) {
				RequestContext.getCurrentInstance().execute(
						"dlgEditaPedido.hide()");
				FacesMessage message = new FacesMessage(
						FacesMessage.SEVERITY_INFO, this.getServico().getValor(
								"msg_header_sucesso"), this.getServico()
								.getValor("msg_pedido_alterar")
								+ "("
								+ numPedido + ")");
				FacesContext.getCurrentInstance().addMessage(null, message);
				filtraSolicitacoes();
			} else {
				RequestContext.getCurrentInstance().execute(
						"dlgErroPedido2.show()");
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@SuppressWarnings("rawtypes")
	@Override
	protected IServicoGenerico getServico() {
		return this.pedidoServico;
	}

	public UsuarioBean getUsuario() {
		return usuario;
	}

	public void setUsuario(UsuarioBean usuario) {
		this.usuario = usuario;
	}

	public SolicitacaoBean getSolicitacao() {
		return solicitacao;
	}

	public void setSolicitacao(SolicitacaoBean solicitacao) {
		this.solicitacao = solicitacao;
	}

	public String getFilialFiltro() {
		return filialFiltro;
	}

	public void setFilialFiltro(String filialFiltro) {
		this.filialFiltro = filialFiltro;
	}

	public String getNumSolicitacaoFiltro() {
		return numSolicitacaoFiltro;
	}

	public void setNumSolicitacaoFiltro(String numSolicitacaoFiltro) {
		this.numSolicitacaoFiltro = numSolicitacaoFiltro;
	}

	public String getNumPedidoFiltro() {
		return numPedidoFiltro;
	}

	public void setNumPedidoFiltro(String numPedidoFiltro) {
		this.numPedidoFiltro = numPedidoFiltro;
	}

	public String getDataDeFiltro() {
		return dataDeFiltro;
	}

	public void setDataDeFiltro(String dataDeFiltro) {
		this.dataDeFiltro = dataDeFiltro;
	}

	public String getDataAteFiltro() {
		return dataAteFiltro;
	}

	public void setDataAteFiltro(String dataAteFiltro) {
		this.dataAteFiltro = dataAteFiltro;
	}

	public String getCodProdFiltro() {
		return codProdFiltro;
	}

	public void setCodProdFiltro(String codProdFiltro) {
		this.codProdFiltro = codProdFiltro;
	}

	public List<SolicitacaoBean> getListaSolicitacoes() {
		return listaSolicitacoes;
	}

	public void setListaSolicitacoes(List<SolicitacaoBean> listaSolicitacoes) {
		this.listaSolicitacoes = listaSolicitacoes;
	}

	public List<ProdutoBean> getItensSolicitacao() {
		return itensSolicitacao;
	}

	public void setItensSolicitacao(List<ProdutoBean> itensSolicitacao) {
		this.itensSolicitacao = itensSolicitacao;
	}

	public SolicitacaoServico<SolicitacaoBean> getSolicitacaoServico() {
		return solicitacaoServico;
	}

	public void setSolicitacaoServico(
			SolicitacaoServico<SolicitacaoBean> solicitacaoServico) {
		this.solicitacaoServico = solicitacaoServico;
	}

	public String getStatusFiltro() {
		return statusFiltro;
	}

	public void setStatusFiltro(String statusFiltro) {
		this.statusFiltro = statusFiltro;
	}

	public String getHistoricoTexto() {
		return historicoTexto;
	}

	public void setHistoricoTexto(String historicoTexto) {
		this.historicoTexto = historicoTexto;
	}

	public String getNumOPFiltro() {
		return numOPFiltro;
	}

	public void setNumOPFiltro(String numOPFiltro) {
		this.numOPFiltro = numOPFiltro;
	}

	public PedidoServico<PedidoBean> getPedidoServico() {
		return pedidoServico;
	}

	public void setPedidoServico(PedidoServico<PedidoBean> pedidoServico) {
		this.pedidoServico = pedidoServico;
	}

	public String getCodForneceFiltro() {
		return codForneceFiltro;
	}

	public void setCodForneceFiltro(String codForneceFiltro) {
		this.codForneceFiltro = codForneceFiltro;
	}

	public String getNomeForneceFiltro() {
		return nomeForneceFiltro;
	}

	public void setNomeForneceFiltro(String nomeForneceFiltro) {
		this.nomeForneceFiltro = nomeForneceFiltro;
	}

	public String getDescProdFiltro() {
		return descProdFiltro;
	}

	public void setDescProdFiltro(String descProdFiltro) {
		this.descProdFiltro = descProdFiltro;
	}

	public List<ProdutoBean> getListaProdutosEditar() {
		return listaProdutosEditar;
	}

	public void setListaProdutosEditar(List<ProdutoBean> listaProdutosEditar) {
		this.listaProdutosEditar = listaProdutosEditar;
	}

	public SolicitacaoBean getSolicitacaoPedidoEditarSel() {
		return solicitacaoPedidoEditarSel;
	}

	public void setSolicitacaoPedidoEditarSel(
			SolicitacaoBean solicitacaoPedidoEditarSel) {
		this.solicitacaoPedidoEditarSel = solicitacaoPedidoEditarSel;
	}

	public ProdutoServico<ProdutoBean> getProdutoServico() {
		return produtoServico;
	}

	public void setProdutoServico(ProdutoServico<ProdutoBean> produtoServico) {
		this.produtoServico = produtoServico;
	}

	public String getNumPedido() {
		return numPedido;
	}

	public void setNumPedido(String numPedido) {
		this.numPedido = numPedido;
	}

}
